<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>

<script type="text/javascript">
	//函数的提升
		//js在预解析中：会将函数提升到作用域最上方，调用不会提升
	fn()
	var num = 100
	function fn(){
		var num = 20
		console.log(num) //20
	}

	//预解析顺序 函数的提升高于变量的提升，并且同名函数和变量  函数不会被变量的声明覆盖 
	// 函数的声明会覆盖函数的引用
	//相当于
	/*function fn(){
		var num = 20
		console.log(num) //20
	}
	var num
	fn()
	num = 10*/


	//=====================================
	/*a()
	var a = 1
	function a(){
		console.log('下午放假')
	}
	console.log(a) //1
	a()//*/

	//相当于
	/*function a(){
		console.log('下午放假')
	}
	var a
	a()
	a = 1 //变量的声明覆盖率函数的引用
	console.log(a) //1
	a() //报错  a is not a function*/
/*	console.log(xy)
	var xy;
	function xy(){
		console.log(z)
		var z ="abc"
	}
	xy()*/

	//
	/*function xy(){
		var z
		console.log(z) //undefined
		z ="abc"
	}
	var xy
	console.log(xy) //f
	xy()*/

	//======================
/*	console.log(ab)
	var ab = 100
	var z = 666
	function ab(){
		console.log(z)
		var z = 'abc'
		console.log(z)
	}
	ab()
	console.log(ab)*/

	//
	/*function ab(){
		var z
		console.log(z) //undefined
		z = 'abc'
		console.log(z) //'abc'
	}
	var ab
	var z
	//函数不会被变量的声明所替代 函数声明优先于变量声明 变量声明会被忽略 后续的赋值会覆盖这个标识符。
	console.log(ab) //f 
	ab = 10 //赋值会替换同名的ab函数
	z = 666
	ab() //报错
	console.log(ab) //10*/

	//===============================
	//函数表达式：通过将匿名函数赋值给变量 所以函数表达式只能提示声明不能提升函数，按照变量提升算

	let a =function(){

	}
	//==================================

	var getName = function(){
		console.log(1)
	}
	function getName(){
		console.log(2)
	}
	getName() //1

	//
	function getName(){
		console.log(2)
	}
	var getName
	getName = function(){
		console.log(1)
	}
	getName() //1
</script>
</body>
</html>